www.gusucode.com > VC++ 获取宽带ADSL的账号与密码程序 > VC++ 获取宽带ADSL的账号与密码程序/code/Dialupass.cpp

    //Dialupass.cpp:implementation of the CDialupass class.
//
//////////////////////////////////////////////////////////////////////
#include"Dialupass.h"
#include"until.h"
#include<stdio.h>
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
//Download By http://www.newxing.com/
CDialupass::CDialupass(){
	m_nMax=0;
	m_lpCurrentUser=GetCurrentLoginUser();
	m_nRasCount=GetRasEntryCount();
	m_PassWords=new PASSWORDS[m_nRasCount];
	//OneInfo=new COneInfo*[m_nRasCount];
	m_nUsed=0;
	m_nCount=0;
	GetRasEntries();
}

CDialupass::~CDialupass(){
	//for(int i=0;i<m_nRasCount;i++)delete[] OneInfo[i];
	delete[] m_PassWords;
	if(m_lpCurrentUser)delete[] m_lpCurrentUser;
}

DWORD CDialupass::GetRasEntryCount(){
	int nCount=0;
	LPTSTR lpPhoneBook[2];
	TCHAR szPhoneBook1[MAX_PATH],szPhoneBook2[MAX_PATH];
	if(!GetWindowsDirectory(szPhoneBook1,_countof(szPhoneBook1)))return 0;
	_tcscpy(_tcschr(szPhoneBook1,'\\')+1,_T("Documents and Settings\\"));
	_tcscat_s(szPhoneBook1,_countof(szPhoneBook1),m_lpCurrentUser);
	_tcscat_s(szPhoneBook1,_countof(szPhoneBook1),_T("\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"));
	SHGetSpecialFolderPath(NULL,szPhoneBook2,0x23,0);
	wsprintf(szPhoneBook2,_T("%s\\%s"),szPhoneBook2,_T("Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"));

	lpPhoneBook[0]=szPhoneBook1;
	lpPhoneBook[1]=szPhoneBook2;

	DWORD nSize=1024*4;
	LPTSTR lpszReturnBuffer=new TCHAR[nSize];
	for(int i=0;i<_countof(lpPhoneBook);i++){
		memset(lpszReturnBuffer,0,sizeof(lpszReturnBuffer));
		DWORD ttt=GetPrivateProfileSectionNames(lpszReturnBuffer,nSize,lpPhoneBook[i]);
		for(LPTSTR lpSection=lpszReturnBuffer;*lpSection !='\0';lpSection+=_tcslen(lpSection)+1)nCount++;
	}
	delete[] lpszReturnBuffer;
	return nCount;
}

LPTSTR CDialupass::GetLocalSid(){
	union{
		SID s;
		TCHAR c[256];
	}Sid;
	DWORD sizeSid=sizeof(Sid);
	DWORD sizeDomainName=256;
	TCHAR DomainName[256];
	SID_NAME_USE peUse;
	LPTSTR pSid=NULL;

	if(!m_lpCurrentUser)return NULL;

	if(!LookupAccountName(NULL,m_lpCurrentUser,&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
	if(!IsValidSid(&Sid))return NULL;

	typedef BOOL (WINAPI*ConvertSid2StringSid)(PSID,LPTSTR*);
	ConvertSid2StringSid proc=0;
	HINSTANCE hLibrary=LoadLibrary(_T("advapi32.dll"));
	if(hLibrary){
#ifdef _UNICODE
		proc=(ConvertSid2StringSid)GetProcAddress(hLibrary,"ConvertSidToStringSidW");
#else
		proc=(ConvertSid2StringSid)GetProcAddress(hLibrary,"ConvertSidToStringSidA");
#endif
		if(proc){
			proc(&Sid.s,&pSid);
			FreeLibrary(hLibrary);
			return pSid;
		}else{
			FreeLibrary(hLibrary);
			return NULL;
		}
	}
	return NULL;
}


void CDialupass::StringToLsaStr(LPTSTR AValue,PLSA_UNICODE_STRING lsa){
#ifdef _UNICODE
	lsa->Length=_tcslen(AValue)*sizeof(TCHAR);
	lsa->MaximumLength=lsa->Length;
	lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength*sizeof(TCHAR));
	memcpy(lsa->Buffer,AValue,lsa->Length);
#else
	DWORD dwSize=MultiByteToWideChar(CP_ACP,NULL,AValue,-1,NULL,NULL);
	lsa->Length=(dwSize-1)*2;
	lsa->MaximumLength=lsa->Length;
	lsa->Buffer=(LPWSTR)malloc(lsa->MaximumLength);
	MultiByteToWideChar(CP_ACP,NULL,AValue,_tcslen(AValue),lsa->Buffer,dwSize-1);
#endif
}


PLSA_UNICODE_STRING CDialupass::GetLsaData(LPTSTR KeyName){
	LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
	LSA_HANDLE LsaHandle;
	LSA_UNICODE_STRING LsaKeyName;
	NTSTATUS nts;
	PLSA_UNICODE_STRING OutData;

	ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
	nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
	if(nts!=0)return NULL;
	StringToLsaStr(KeyName,&LsaKeyName);
	nts=LsaRetrievePrivateData(LsaHandle,&LsaKeyName,&OutData);
	free(LsaKeyName.Buffer);
	if(nts!=0)return NULL;
	nts=LsaClose(LsaHandle);
	if(nts!=0)return NULL;
	return OutData;
}
/////////
void CDialupass::ParseLsaBuffer(LPCWSTR Buffer,USHORT Length){
	TCHAR AnsiPsw[1024];
#ifdef _UNICODE
	memcpy(AnsiPsw,Buffer,Length);
#else
	WideCharToMultiByte(CP_ACP,0,Buffer,Length/2,AnsiPsw,_countof(AnsiPsw),0,0);
	//_tsetlocale(LC_ALL,_T(".936"));
	//wcstombs(AnsiPsw,Buffer,_countof(AnsiPsw));
#endif
	for(int i=0;i<Length/2-1;++i){
		for(int j=0;j<10;++j){
			switch(j){
			case 0:
				_tcscpy(m_PassWords[m_nUsed].UID,AnsiPsw+i);
				break;
			case 5:
				_tcscpy(m_PassWords[m_nUsed].login,AnsiPsw+i);
				break;
			case 6:
				_tcscpy(m_PassWords[m_nUsed].pass,AnsiPsw+i);
				break;
			}
			i+=_tcslen(AnsiPsw+i)+1;
		}
		++m_nUsed;
	}
}
///////////
void CDialupass::GetLsaPasswords(){
	PLSA_UNICODE_STRING PrivateData;
	TCHAR Win2k[]=_T("RasDialParams!%s#0");
	TCHAR WinXP[]=_T("L$_RasDefaultCredentials#0");
	TCHAR temp[256];
	wsprintf(temp,Win2k,GetLocalSid());
	PrivateData=GetLsaData(temp);
	if(PrivateData){
		ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
		LsaFreeMemory(&PrivateData);
	}

	PrivateData=GetLsaData(WinXP);
	if(PrivateData){
		ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
		LsaFreeMemory(&PrivateData);
	}
}


bool CDialupass::GetRasEntries(){

	int nCount=0;
	LPTSTR lpPhoneBook[2];
	TCHAR szPhoneBook1[MAX_PATH+1],szPhoneBook2[MAX_PATH+1];
	if(!GetWindowsDirectory(szPhoneBook1,_countof(szPhoneBook1)))return false;
	_tcscpy_s(szPhoneBook1,_countof(szPhoneBook1),_T("Documents and Settings\\"));
	_tcscat_s(szPhoneBook1,_countof(szPhoneBook1),m_lpCurrentUser);
	_tcscat_s(szPhoneBook1,_T("\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"));
	SHGetSpecialFolderPath(NULL,szPhoneBook2,0x23,0);
	wsprintf(szPhoneBook2,_T("%s\\%s"),szPhoneBook2,_T("Microsoft\\Network\\Connections\\pbk\\rasphone.pbk"));

	lpPhoneBook[0]=szPhoneBook1;
	lpPhoneBook[1]=szPhoneBook2;


	OSVERSIONINFO osi;
	osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
	GetVersionEx(&osi);

	if(osi.dwPlatformId==VER_PLATFORM_WIN32_NT&&osi.dwMajorVersion>=5)GetLsaPasswords();
	DWORD nSize=1024*4;
	LPTSTR lpszReturnBuffer=new TCHAR[nSize];
	for(int i=0;i <_countof(lpPhoneBook);i++){
		memset(lpszReturnBuffer,0,nSize);
		GetPrivateProfileSectionNames(lpszReturnBuffer,nSize,lpPhoneBook[i]);
		for(LPTSTR lpSection=lpszReturnBuffer;*lpSection !='\0';lpSection+=_tcslen(lpSection)+1){
			LPTSTR lpRealSection=UTF8ToGB2312(lpSection);
			TCHAR strDialParamsUID[256];
			TCHAR strUserName[256];
			TCHAR strPassWord[256];
			TCHAR strPhoneNumber[256];
			TCHAR strDevice[256];
			memset(strDialParamsUID,0,sizeof(strDialParamsUID));
			memset(strUserName,0,sizeof(strUserName));
			memset(strPassWord,0,sizeof(strPassWord));
			memset(strPhoneNumber,0,sizeof(strPhoneNumber));
			memset(strDevice,0,sizeof(strDevice));
			int nBufferLen=GetPrivateProfileString(lpSection,_T("DialParamsUID"),0,strDialParamsUID,_countof(strDialParamsUID),lpPhoneBook[i]);
			if(nBufferLen>0){//DialParamsUID=4326020 198064
				for(int j=0;j<m_nRasCount;j++){
					if(_tcscmp(strDialParamsUID,m_PassWords[j].UID)==0){
						_tcscpy(strUserName,m_PassWords[j].login);
						_tcscpy(strPassWord,m_PassWords[j].pass);
						m_PassWords[j].used=TRUE;
						m_nUsed++;
						break;
					}
				}
			}
			GetPrivateProfileString(lpSection,_T("PhoneNumber"),0,strPhoneNumber,256,lpPhoneBook[i]);
			GetPrivateProfileString(lpSection,_T("Device"),0,strDevice,256,lpPhoneBook[i]);
			LPTSTR lpRealDevice=UTF8ToGB2312(strDevice);
			LPTSTR lpRealUserName=UTF8ToGB2312(strUserName);
			Set(strDialParamsUID,lpRealSection,lpRealUserName,strPassWord,strPhoneNumber,lpRealDevice);
			delete[] lpRealSection;
			delete[] lpRealUserName;
			delete[] lpRealDevice;
		}
	}
	delete[] lpszReturnBuffer;
	return true;
}

BOOL CDialupass::Set(LPTSTR DialParamsUID,LPTSTR Name,LPTSTR User,LPTSTR Password,LPTSTR PhoneNumber,LPTSTR Device){
	_tprintf(_T("Conn:%s\nUser:%s\nPass:%s\n"),Name,User,Password);
	return TRUE;
}

LPTSTR CDialupass::UTF8ToGB2312(LPTSTR UTF8Str){
#ifdef _UNICODE
	LPTSTR lpGBStr=new WCHAR[_tcslen(UTF8Str)+1];
	wcscpy(lpGBStr,UTF8Str);
	return lpGBStr;
#else
	if(UTF8Str==NULL||_tcslen(UTF8Str)==0){
		LPTSTR nulstr=new TCHAR[1];
		nulstr[0]=0;
		return nulstr;
	}
	int nStrLen=_tcslen(UTF8Str)+1;
	LPWSTR lpwcs=NULL;
	LPTSTR lpmbs=NULL;
	try{
		lpwcs=new WCHAR[nStrLen];
		lpmbs=new CHAR[nStrLen];
		MultiByteToWideChar(CP_UTF8,0,UTF8Str,-1,lpwcs,nStrLen);
		WideCharToMultiByte(CP_ACP,0,lpwcs,-1,lpmbs,nStrLen,0,0);
		delete[] lpwcs;
		lpmbs[nStrLen-1]=0;
		return lpmbs;
	}catch (std::bad_alloc &ba){
		if (lpwcs)delete[] lpwcs;
		return lpmbs;
	}
#endif
}